]> git.r.bdr.sh - rbdr/super-polarity/blobdiff - Super Polarity/Actors/MainShip.cs
Protoshow sprint.
[rbdr/super-polarity] / Super Polarity / Actors / MainShip.cs
index 616f16e507779277b65fe0a0114a03b98e731368..9f28c80c5c51298888ceb095e59641cab87b0886 100644 (file)
@@ -6,6 +6,7 @@ using System.Threading;
 using Microsoft.Xna.Framework;
 using Microsoft.Xna.Framework.Content;
 using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Audio;
 
 namespace SuperPolarity
 {
@@ -24,6 +25,10 @@ namespace SuperPolarity
         protected float MaxImmortalTime;
         protected bool Flashing;
 
+        protected SoundEffect PolarityChange;
+        protected SoundEffect ShootSound;
+        protected SoundEffect Hit;
+
         public MainShip(SuperPolarity newGame) : base(newGame) {}
 
         ~MainShip()
@@ -35,12 +40,18 @@ namespace SuperPolarity
         {
             base.Initialize(texture, position);
 
-            MainShip.BlueColor = new Color(230, 244, 249);
-            MainShip.RedColor = new Color(255, 234, 241);
+            MainShip.BlueColor = new Color(0, 184, 229);
+            MainShip.RedColor = new Color(201, 0, 68);
+
+            PolarityChange = game.Content.Load<SoundEffect>("Sound\\polaritychange");
+            ShootSound = game.Content.Load<SoundEffect>("Sound\\bullet");
+            Hit = game.Content.Load<SoundEffect>("Sound\\hit");
 
             InitParticleEngine();
             SetPolarity(Polarity.Positive);
 
+            ActVelocity = 2.5f;
+
             ShotCooldown = 50;
             MaxImmortalTime = 1500;
 
@@ -68,19 +79,28 @@ namespace SuperPolarity
 
         protected void HandleShot(float value)
         {
+
+            Shooting = true;
+            Timer t = new Timer(new TimerCallback(UnlockShot));
+            t.Change(ShotCooldown, Timeout.Infinite);
+
+            if (Children.Count > 10)
+            {
+                return;
+            }
+
             var bullet = ActorFactory.CreateBullet(Position, Angle);
 
             Children.Add(bullet);
             bullet.Parent = this;
 
-            Shooting = true;
-            Timer t = new Timer(new TimerCallback(UnlockShot));
-            t.Change(ShotCooldown, Timeout.Infinite);
+            ShootSound.Play();
         }
 
         protected void UnlockShot(object state)
         {
             InputController.Unlock("shoot");
+            Shooting = false;
         }
 
         protected void HandleChangePolarity(float value)
@@ -90,28 +110,29 @@ namespace SuperPolarity
 
         public void HandleHorizontalMovement(float value)
         {
-            Acceleration.X = value * AccelerationRate;
-
-            if (value > 0.1 && Velocity.X < 0 || value < 0.1 && Velocity.X > 0)
+            if (value >= -0.5 && value <= 0.5)
             {
-                Acceleration.X *= 2;
+                value = 0;
             }
 
-            if (value > 0.1 && Velocity.Y < 0 || value < 0.1 && Velocity.Y > 0)
-            {
-                Acceleration.Y *= 2;
-            }
+            Velocity.X = value * MaxVelocity;
         }
 
         public void HandleVerticalMovement(float value)
         {
-            Acceleration.Y = value * AccelerationRate;
+            if (value >= -0.5 && value <= 0.5)
+            {
+                value = 0;
+            }
+
+            Velocity.Y = value * MaxVelocity;
         }
 
         public override void SwitchPolarity()
         {
             base.SwitchPolarity();
             SwitchParticleEngine(CurrentPolarity);
+            PolarityChange.Play();
             game.Player.ResetMultiplier();
         }
 
@@ -144,7 +165,6 @@ namespace SuperPolarity
             particleEngine.Update();
             ConstrainToEdges();
             UpdateImmortality(gameTime);
-            Shooting = false;
         }
 
         public void UpdateImmortality(GameTime gameTime)
@@ -174,30 +194,36 @@ namespace SuperPolarity
 
         public override void Move(GameTime gameTime)
         {
-            base.Move(gameTime);
+            var VelocityLimit = MaxVelocity;
+            var SavedVelocity = new Vector2(Velocity.X, Velocity.Y);
 
             if (Shooting)
             {
-                if (Velocity.X > ActVelocity)
-                {
-                    Velocity.X = ActVelocity;
-                }
+                VelocityLimit = ActVelocity;
+            }
 
-                if (Velocity.X < -ActVelocity)
-                {
-                    Velocity.X = -ActVelocity;
-                }
+            if (SavedVelocity.X > VelocityLimit)
+            {
+                SavedVelocity.X = VelocityLimit;
+            }
 
-                if (Velocity.Y > ActVelocity)
-                {
-                    Velocity.Y = ActVelocity;
-                }
+            if (SavedVelocity.X < -VelocityLimit)
+            {
+                SavedVelocity.X = -VelocityLimit;
+            }
 
-                if (Velocity.Y < -ActVelocity)
-                {
-                    Velocity.Y = -ActVelocity;
-                }
+            if (SavedVelocity.Y > VelocityLimit)
+            {
+                SavedVelocity.Y = VelocityLimit;
+            }
+
+            if (SavedVelocity.Y < -VelocityLimit)
+            {
+                SavedVelocity.Y = -VelocityLimit;
             }
+
+            Position.X = Position.X + SavedVelocity.X;
+            Position.Y = Position.Y + SavedVelocity.Y;
         }
 
         public override void Magnetize(Ship ship, float distance, float angle)
@@ -266,11 +292,23 @@ namespace SuperPolarity
             if (game.Player.Lives < 0)
             {
                 Dying = true;
+                game.GameOver();
             }
             else {
+                Hit.Play();
                 Immortal = true;
                 CurrentImmortalTime = 0;
             }
         }
+
+        public override void CleanUp()
+        {
+            base.CleanUp();
+            particleEngine = null;
+            InputController.Unbind("moveX", HandleHorizontalMovement);
+            InputController.Unbind("moveY", HandleVerticalMovement);
+            InputController.Unbind("changePolarity", HandleChangePolarity);
+            InputController.Unbind("shoot", HandleShot);
+        }
     }
 }